%    Copyright (C) 1997, 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: gs_dps1.ps 6300 2005-12-28 19:56:24Z giles $
% Initialization file for most of the Display PostScript functions
% that are also included in Level 2.

level2dict begin

% ------ Virtual memory ------ %

/currentshared /.currentglobal load def
/scheck /.gcheck load def
%****** FOLLOWING IS WRONG ******
/shareddict currentdict /globaldict .knownget not { 20 dict } if def

% Global and LocalFontDirectory must remain in systemdict
% even if we temporarily exit Level 2 mode.

end				% level2dict
systemdict begin

/SharedFontDirectory .FontDirectory .gcheck
 { .currentglobal false .setglobal
   /LocalFontDirectory .FontDirectory dup maxlength dict copy
   .forcedef	% LocalFontDirectory is local, systemdict is global
   .setglobal .FontDirectory
 }
 { /LocalFontDirectory .FontDirectory
   .forcedef	% LocalFontDirectory is local, systemdict is global
   50 dict
 }
ifelse def

end				% systemdict
level2dict begin

% setshared must rebind FontDirectory to the appropriate one of
% Local or SharedFontDirectory.

/.setglobal		% <bool> .setglobal -
 { dup .setglobal
   //systemdict /FontDirectory .currentglobal
    { //SharedFontDirectory }
    { /LocalFontDirectory .systemvar }	% can't embed ref to local VM
   ifelse .forceput pop	% LocalFontDirectory is local, systemdict is global
 } .bind odef		% must bind .forceput and .setglobal
			% even if NOBIND in effect
% Don't just copy (load) the definition of .setglobal:
% it gets redefined for LL3.
/setshared { /.setglobal .systemvar exec } odef
.currentglobal setshared

% See below for changes in save and restore.

% ------ Fonts ------ %

/selectfont		% <fontname> <size> selectfont -
 { 1 index findfont
   1 index dup type /arraytype eq { makefont } { scalefont } ifelse
   setfont pop pop
 } odef
% undefinefont has to take local/global VM into account.
/undefinefont		% <fontname> undefinefont -
 { .FontDirectory 1 index .undef
   .currentglobal
    {		% Current mode is global; delete from local directory too.
      //systemdict /LocalFontDirectory .knownget
       { 1 index .undef }
      if
    }
    {		% Current mode is local; if there was a shadowed global
		% definition, copy it into the local directory.
      //systemdict /SharedFontDirectory .knownget
       { 1 index .knownget
	  { .FontDirectory 2 index 3 -1 roll put }
	 if
       }
      if
    }
   ifelse pop
 } odef

% If we load a font into global VM within an inner save, the restore
% will delete it from FontDirectory but not from SharedFontDirectory.
% We have to handle this by making restore copy missing entries from
% SharedFontDirectory to FontDirectory.  Since this could slow down restore
% considerably, we define a new operator .dictcopynew for this purpose.
% Furthermore, if FAKEFONTS is in effect, we want global real fonts to
% override fake local ones.  We handle this by brute force.
/restore		% <save> restore -
 { dup //restore	% bind even if NOBIND
   /LocalFontDirectory .systemvar
   FAKEFONTS
    { mark
		% We want to delete a fake font from the local directory
		% iff the global directory now has no definition for it,
		% or a non-fake definition.
      1 index dup
       {		% Stack: lfd mark lfd key ... lfd key value
	 length 1 gt
	  {		% This is a real local definition; don't do anything.
	    pop
	  }
	  {		% This is a fake local definition, check for global.
	    //SharedFontDirectory 1 index .knownget
	     {		% A global definition exists, check for fake.
	       length 1 eq { pop } { 1 index } ifelse
	     }
	     {		% No global definition, delete the local one.
	       1 index
	     }
	    ifelse
	  }
	 ifelse
       } forall
      pop counttomark 2 idiv { .undef } repeat pop
    }
   if
   //SharedFontDirectory exch .dictcopynew pop
   .currentglobal .setglobal	% Rebind FontDirectory according to current VM.
   pop
 } bind odef

% ------ Miscellaneous ------ %

/undef /.undef load def

end				% level2dict
